#ifndef OO_H_
#define OO_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// =======================
// 基础对象定义
// =======================
typedef struct Object Object;
struct Object {
    const void* vptr;  // 指向虚函数表
};

// =======================
// 核心宏：定义类（声明）
// =======================
#define DECLARE_CLASS(Class) \
    typedef struct Class Class;

// =============================
// 定义虚函数表（vtable）
// =============================
#define BEGIN_VTABLE(Class) \
    //  ##操作符，为拼接操作符
    //  将两个记号连接（拼接）成一个新的标识符，它在宏展开时由预处理器完成。
    //  Class##VTable ==> ClassVTable
    typedef struct Class##VTable { \

//  ...代表可变参数，__VA_ARGS__是一个预定义标识符，用于在宏体中表示...所代表的所有可变参数。
//  处理空参数列表(GCC扩展)
//  当可变参数为空时，有些编译器(如GCC)支持特殊处理，标准C中，如果可变参数为空，__VA_ARGS__会变为空
//  可能导致语法错误，例如末尾多一个逗号。
//  ##__VA_ARGS是GCC的拓展，##操作符可以消除前面的逗号，当可变参数为空时不会产生多余的逗号。
#define VFUNC(Class, ret, name, ...) \
        ret (*name)(Class* self, ##__VA_ARGS__);

#define END_VTABLE(Class) \
    } Class##VTable;

// =============================
// 定义类结构体（带基类继承）
// =============================
#define BEGIN_CLASS_DERIVED(Class, Base) \
    struct Class { \
        Base base;

//  默认基类
#define BEGIN_CLASS(Class) BEGIN_CLASS_DERIVED(Class, Object)

#define END_CLASS };

// =============================
// 实现类（构造 + 虚表）
// =============================
#define IMPLEMENT_CLASS(Class, Base) \
    Class##VTable Class##_vtable; \
    \
    static void Class##_destroy_impl(Class* self); \
    \
    Class* new_##Class() { \
        Class* self = (Class*)calloc(1, sizeof(Class)); \
        if (!self) return NULL; \
        self->base.vptr = (const void*)&Class##_vtable; \
        return self; \
    } \
    \
    void Class##_destroy(Class* self) { \
        if (self) { \
            Class##_destroy_impl(self); \
        } \
    }

// =============================
// 虚函数调用宏
// =============================
#define VIRTUAL_CALL(Class, self, func, ...) \
    (((Class##VTable*)((self)->base.vptr))->func(self, ##__VA_ARGS__))

#endif // OO_H_